# 1、迭代列表时如何访问列表下标索引

# # 普通
# items = [8, 23, 45]
# for index in range(len(items)):
#     print(index, "-->", items[index])
#
# # 优雅
# for index, item in enumerate(items):
#     print(index, "-->", item)
#
# # enumerate还可以指定元素的第一个元素从几开始，默认是0，也可以指定从1开始：
# for index, item in enumerate(items, start=1):
#     print(index, "-->", item)


# 2、append 与 extend 方法有什么区别

# x = [1, 2, 3]
# y = [4, 5]
# x.append(y)
# print(x)
#
# x = [1, 2, 3]
# y = [4, 5]
# x.extend(y)
# print(x)


# 3、检查列表是否为空

# items = []
#
# if len(items) == 0:
#     print("空列表")
#
# if items == []:
#     print("空列表")
#
# # 优雅
# if not items:
#     print("空列表")

# 4、如何理解切片

# a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#
# print(a[3:8]) # 第3到第8位置之间的元素
# # 输出 [4, 5, 6, 7, 8]
#
# print(a[3:8:2]) # 第3到第8位置之间的元素，每隔一个元素获取
# # 输出 [4, 6, 8]
#
# print(a[:5]) # 省略start表示从第0个元素开始
# # 输出 [1, 2, 3, 4, 5]
#
# print(a[3:]) # 省略end表示到最后一个元素
# # 输出 [4, 5, 6, 7, 8, 9, 10]
#
# print(a[::]) # 都省略相当于拷贝一个列表，这种拷贝属于浅拷贝
# # 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#
# print(a[-1::-1]) # 逆序输出列表
# # 输出 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

# 5、如何拷贝一个列表对象

# # 浅拷贝测试
# L1 = [[1,2,3],[4,5,6],[7,8,9]]
# L2 = L1[::]
# L2[0][0] = 11
# print(L1) # 输出结果[[11, 2, 3], [4, 5, 6], [7, 8, 9]]，证明了是一个浅拷贝

# # 深拷贝测试
# import copy
# L1 = [[1,2,3],[4,5,6],[7,8,9]]
# L2 = copy.deepcopy(L1)
# L2[0][0] = 11
# print(L1) # 输出结果[[1, 2, 3], [4, 5, 6], [7, 8, 9]]，证明了是一个深拷贝

# # 浅拷贝再测试
# L1 = [1,2,3]
# L2 = L1[::]
# L2[0] = 11 # 输出结果[1, 2, 3]，这种方式是测试不出浅拷贝的
# print(L1)

# # 浅拷贝的其他方式
# L1 = [[1,2,3],[4,5,6],[7,8,9]]
# L2 = L1[:] # L1[::] / L1[:] / list(L1) / copy.copy() need import copy
# L2[0][0] = 11
# print(L1) # 输出结果[[11, 2, 3], [4, 5, 6], [7, 8, 9]]，证明了是一个浅拷贝


# 6、如何获取列表中的最后一个元素

# a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# print(a[len(a)-1]) # 常见的写法
# print(a[-1]) # 负数表示从列表的右边开始索引


# 7、如何对列表进行排序

# items = [{'name': 'Homer', 'age': 39},
#          {'name': 'Bart', 'age': 10},
#          {"name": 'cater', 'age': 20}]
#
# items.sort(key=lambda item: item.get("age")) # items.sort(key=lambda item: item.get("age"), reverse=True)
#
# print(items) # 注意已经修改了原列表

# items = [{'name': 'Homer', 'age': 39},
#          {'name': 'Bart', 'age': 10},
#          {"name": 'cater', 'age': 20}]
#
# new_items = sorted(items, key=lambda item: item.get("age"))
#
# print(items) # 注意并没有修改原列表


# 8、如何移除列表中的元素

# a = [0, 2, 2, 3]
# a.remove(2) # 删除第一次出现的对象
# print(a)

# a = [3, 2, 2, 1]
# del a[1] # 删除下标为1的元素
# print(a)

# a = [4, 3, 5]
# b = a.pop(1) # pop与del类似，但是 pop 方法可以返回移除的元素
# print(b)


# 9、如何连接两个列表

# listone = [1, 2, 3]
# listtwo = [4, 5, 6]
# mergedlist = listone + listtwo
# print(mergedlist)

# 列表实现了 + 的运算符重载，使得 + 不仅支持数值相加，还支持两个列表相加，只要你实现了对象的add操作，任何对象都可以实现 + 操作，例如：

# class User(object):
#
#     def __init__(self, age):
#         self.age = age
#
#     def __repr__(self):
#         return 'User(%d)' % self.age
#
#     def __add__(self, other):
#         age = self.age + other.age
#         return User(age)
#
# user_a = User(10)
# user_b = User(20)
#
# c = user_a + user_b
#
# print(c)


